Coinを追加する + AnimationPlayer
実装するアニメ
コインの回転 > SpriteFrame
コインのシュリンク > scale を property track で animation
https://gyazo.com/d50ff3d9aad69ac6efb1b69af777ce03
1. 新規Scene > Node2D
2. AnimatedSprite > 新規SpriteFrame
1 > 2 > 3 > 4 > 3 > 2
fpsは6 ~ 7
3. Add > Area2D > CollisionShape2D > CircleShape
4. Add > AudioStreamPlayer > coin_SFX.ogg
5. Add > AnimationPlayer
https://gyazo.com/5b5edeefe56d7b75bcd33162ef9e657d
Q. AnimationPlayerが操作できるものは?
A. 基本的には何でも!
コンセプトとして、タイムラインにキーフレームを打って
そのタイミングで以下のような操作を発火する
プロパティのset
関数の実行
https://gyazo.com/bd51c0170fd72b8c9c142901a5d80587
ちなみに、timelineの横軸はsecond(秒)
fpsではない
インスペクターを使ったキーフレームの挿入
プロパティトラックを追加した状態で、そのプロパティを持つNodeを選択するし
下のタブをアニメーションにすると、プロパティの横にkeyのマークが出る。
(プロパティトラックを作っていなくても)
それを使ってもタイムラインにキーフレームを挿入できる。
ベジェ曲線は使わないで作ってみる。
total > 0.5s
scale : 1 > 1.5(2s) > 0.1
とったコインを消滅させる
2通りの方法
Object.
free() : メモリからオブジェクトを解放する。
queue_free() : メモリから順番を待って削除(free()より安全)
アニメーションが終わってから解放する
とったらすぐにqueue_free()すると、
shlinkアニメーションや取得音が流れない。
animation の Callback Track を使って、die アニメーションの終わり際にdie()が実行されるようにする。
code: Coin.py
extends Node2D
func _on_Area2D_body_entered(body):
$AnimationPlayer.play("die")
$AudioStreamPlayer2D.play()
func die():
queue_free()
https://gyazo.com/0767a5fa9b00400d56d95d1d1561b3b2
GameState.gd でとったコイン枚数を管理
get_tree().call_group() による、ブロードキャスト通信で
Coin (衝突検出) > GameState.coinup( ) > GUI.update_coin( coins )
というように呼び出す。
code: Coin.gd
func _on_Area2D_body_entered(body):
get_tree().call_group("GameState", "coin_up")
code: GameState.py
var coins = 0
func coin_up():
coins += 1
get_tree().call_group("GUI", "update_coins", coins)
code: GUI.py
func update_coins(coins):
$Control/TextureRect/HBoxContainer/CoinCount.text = str(coins)
is_takenフラグで二重取得を防ぐ
animationでコインが開放されるまで、Area2Dが残っているので
反復横とびすると複数取得できてしまう。
is_token : bool を設定しておいて、2重取得できないようにする
code: Coin.py
var is_taken = false
func _on_Area2D_body_entered(body):
if not is_taken:
is_taken = true
# Code
コイン取得枚数を一定数取得したら、ライフアップ
code: GameState.py
var coins = 0
export var target_coins_number = 3
func coin_up():
coins += 1
update_GUI(lives, coins)
var is_multiple_of_target = (coins % target_coins_number) == 0
if is_multiple_of_target:
life_up()
func life_up():
lives += 1
func update_GUI(lives_left, coins):
get_tree().call_group("GUI", "update_gui", lives, coins)
GameState.gd に新しい変数を作り、
targetとなるコインの枚数を超えたらゲームを終了する。
ついでに、livesとcoinsは一緒に更新するようにする
(関数が減って楽になる)
まとめ
AnimationPlayer
Key frame の基礎
関数を Key Frameで呼ぶ